using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Boa.AIT.AccesoDatos.Entidades;
using Boa.AIT.AccesoDatos.Contratos;
using Boa.AIT.Negocios.Servicios;
using Boa.AIT.Negocios.Excepciones;

namespace Boa.AIT.Negocios
{
   /// <summary>
   /// Implementacion de la interface IAIT_EquipoDisponibleNegociosServicio, los metodos que estan definidos en el contrato IAIT_EquipoDisponibleNegociosServicio serán accesibles desde un contexto externo
   /// </summary>	
   public class AIT_EquipoDisponibleNegocios : IAIT_EquipoDisponibleNegociosServicio
   {
	private IAIT_EquipoDisponibleAccesoDatos accesoDatos;
	public AIT_EquipoDisponibleNegocios()
	{		
		accesoDatos = DataFactory.Current.GetAIT_EquipoDisponibleAccesoDatos();
	}
	
	/// <summary>
    /// Devuelve una lista de AIT_EquipoDisponible's de las ocurrencias encontradas a partir del filtro
    /// </summary>    
	public List<AIT_EquipoDisponible> BuscarPorFiltro(string filtro)
	{
		return accesoDatos.BuscarPorFiltro(filtro).ToList();
	}

	#region operaciones básicas
	
	/// <summary>
    /// Elimina la entidad AIT_EquipoDisponible, lanzará una excepcion si la entidad guarda dependencia a otras entidades
    /// </summary>	
	public void Eliminar(AIT_EquipoDisponible entidad)
	{
		try
		{
		    accesoDatos.Delete(accesoDatos.GetById(entidad.Id));
	    }
		catch(Exception ex)
		{
		   throw new AIT_EquipoDisponibleEliminarExcepcion("AIT_EquipoDisponible");
		}
	}
	
	/// <summary>
    /// Devuelve AIT_EquipoDisponible, buscada por su Id, si no existe, entonces devuelve null
    /// </summary>	
	public AIT_EquipoDisponible ObtenerPorId(object Id)
	{
		return accesoDatos.GetById(Id);
	}

	/// <summary>
    /// Devuelve List<AIT_EquipoDisponible>, de todas la entidades de ese tipo
    /// </summary>	
	public List<AIT_EquipoDisponible> ObtenerTodas()
	{
		return accesoDatos.GetAll().ToList();
	}

	
	/// <summary>
    /// Guarda AIT_EquipoDisponible, previa ejecucion satisfactoria de las reglas de negocio
    /// </summary>	
	public AIT_EquipoDisponible Guardar(AIT_EquipoDisponible entidad)
	{
		//Agregar aqui las reglas de negocio.......	
		if(entidad==null)
		 throw new AIT_EquipoDisponibleRequeridoExcepcion();

        if (string.IsNullOrEmpty(entidad.Guid))
            entidad.Guid = System.Guid.NewGuid().ToString();

			
		if (entidad.Id == 0)
			accesoDatos.Insert(entidad);
		else
			accesoDatos.Update(entidad);

		return entidad;
	}

	#endregion

    public AIT_EquipoDisponible GuardarEquipoDisponible(string nombre, string descripcion, bool ListoParaEntregar, string GuidEquipo, string GuidAccesorios)
    {
        if (string.IsNullOrEmpty(GuidEquipo))
            throw new GuidEquipoRequeridoExcepcion();
        if (string.IsNullOrEmpty(nombre))
            throw new NombreEquipoRequeridoExcepcion();

        List<AIT_EquipoIT> equipos =  DataFactory.Current.GetAIT_EquipoITAccesoDatos().GetPorGuid(GuidEquipo).ToList();
        List<AIT_EquipoIT> accesorios =  DataFactory.Current.GetAIT_EquipoITAccesoDatos().GetPorGuid(GuidAccesorios).ToList();
        

        AIT_EquipoDisponible disponible = new AIT_EquipoDisponible();
        disponible.Guid = System.Guid.NewGuid().ToString();
        disponible.Codigo = equipos[0].Codigo;
        disponible.Nombre = nombre;
        disponible.Descripcion = descripcion;
        disponible.ListoParaEntregar = ListoParaEntregar;

        Guardar(disponible);


        AIT_EquipoDisponibleItem itemEquipo = new AIT_EquipoDisponibleItem();
        itemEquipo.EquipoDisponible = disponible;
        itemEquipo.Equipo = equipos[0];
        DataFactory.Current.GetAIT_EquipoDisponibleItemAccesoDatos().Insert(itemEquipo);


        foreach (var item in accesorios)
        {
            DataFactory.Current.GetAIT_EquipoDisponibleItemAccesoDatos().Insert(
                new AIT_EquipoDisponibleItem() { Equipo = item, EquipoDisponible = disponible}
                );
        }

        return disponible;


    }


    public List<AIT_EquipoDisponible> GetEquiposNoAsignados()
    {
        return accesoDatos.GetEquiposNoAsignados().ToList();
    }
   }
}


